Skip to content

《C语言程序设计》期末试卷 (精选10)

一、单项选择题(每小题 1 分,共 14 分)

要求: 根据题目从 A、B、C、D 中选择一个正确的选项

  1. C 语言规定:在一个源程序中,main 的位置( )
    • A. 必须在最开始
    • B. 必须在系统调用的库函数后面
    • C. 可以任意
    • D. 必须在最后
查看答案与解析

答案:C

解析: main 函数可以放在源程序的任何位置,编译器通过函数名定位入口点,而非物理位置。


难度: ⭐ 考点: #main函数 #程序结构

💡 学习锦囊

📖 相关公式与知识点:

  • C 程序有且仅有一个 main 函数作为入口。
  • main 函数的物理位置不影响程序执行。

思路分析

区分"逻辑入口"与"物理位置"——执行从 main 开始是逻辑上的,代码书写顺序是物理上的。

🔄 举一反三
  1. 一个 C 程序可以有多个 main 函数吗?
    查看练习答案与解析

    答案:不可以。 解析:main 是程序的唯一入口,定义多个会导致"重定义"编译错误。

  1. C 语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符( )
    • A. 必须为字母
    • B. 必须为下划线
    • C. 必须为字母或下划线
    • D. 可以是字母、数字和下划线中的任意一种
查看答案与解析

答案:C

解析: 标识符的第一个字符必须是字母或下划线,不能是数字。


难度: ⭐ 考点: #标识符 #命名规则

💡 学习锦囊

📖 相关公式与知识点:

  • 合法标识符:以字母或下划线开头,后跟字母、数字或下划线。
  • 关键字(如 int, if, while)不能作为标识符。

易错点

数字可以出现在标识符中,但不能作为第一个字符。

🔄 举一反三
  1. 以下哪个是合法的 C 语言标识符?
    • A. 2name
    • B. _count
    • C. float
    查看练习答案与解析

    答案:B 解析:A 以数字开头不合法,C 是关键字不合法。

  1. 已有如下定义和输入语句,若要求 a1, a2, c1, c2 的值分别为 10, 20, A 和 B,当从第一列开始输入数据时,正确的数据输入方式是( )。
c
int a1, a2;
char c1, c2;
scanf("%d%c%d%c", &a1, &c1, &a2, &c2);
  • A. 10A20B
  • B. 10 A 20 B
  • C. 10A 20B
  • D. 10A20 B
查看答案与解析

答案:A

解析:%c 会读取任何字符包括空格和换行符。如果输入中有空格,空格会被 %c 读取,导致 c1 获得空格而非 'A'。


难度: ⭐⭐ 考点: #scanf #格式符%c

💡 学习锦囊

📖 相关公式与知识点:

  • %d 会跳过前导空白字符,%c 不会跳过。
  • %c 读取任意一个字符,包括空格、换行符。

易错点

%d%c 混用时,注意 %c 可能读取到残留的空白字符。

🔄 举一反三
  1. 若输入 10 A 20 B,c1 的值是什么?
    查看练习答案与解析

    答案:空格字符 解析%d 读取 10 后,%c 读取紧随的空格。

  1. C 语言对嵌套 if 语句的规定是:else 总是与( )。
    • A. 其之前最近的 if 配对
    • B. 第一个 if 配对
    • C. 缩进位置相同的 if 配对
    • D. 其之前最近的且尚未配对的 if 配对
查看答案与解析

答案:D

解析: else 总是与最近的尚未配对的 if 配对,这是 C 语言的"就近配对"原则。


难度: ⭐ 考点: #if-else #嵌套

💡 学习锦囊

📖 相关公式与知识点:

  • else 的配对规则:向上找最近的、尚未与 else 配对的 if。
  • 使用大括号 {} 可以明确改变配对关系。

易错点

缩进不影响配对关系,C 语言只看语法结构不看缩进。

🔄 举一反三
  1. 以下代码中 else 与哪个 if 配对?
c
if (a>0)
    if (b>0) x=1;
else x=2;
查看练习答案与解析

答案:与 if (b>0) 配对 解析:else 与最近的未配对 if 配对。

  1. 当 a=1, b=3, c=5, d=4 时,执行完下面一段程序后 x 的值是( )。
c
if (a<b)
    if (c<d) x=1;
    else
        if (a<c)
            if (b<d) x=2;
            else x=3;
        else x=6;
else x=7;
  • A. 1
  • B. 2
  • C. 3
  • D. 4
查看答案与解析

答案:C

解析:

  • a<b (1<3) 为真,进入外层 if
  • c<d (5<4) 为假,进入 else
  • a<c (1<5) 为真,进入内层 if
  • b<d (3<4) 为假,执行 else x=3

难度: ⭐⭐ 考点: #if-else嵌套 #逻辑追踪

💡 学习锦囊

📖 相关公式与知识点:

  • 逐层追踪 if-else 的执行路径。
  • 画出决策树有助于理解嵌套结构。

思路分析

从最外层条件开始,逐步向内追踪,记录每一步的真假判断。

🔄 举一反三
  1. 若 a=1, b=3, c=2, d=4,x 的值是多少?
    查看练习答案与解析

    答案:1 解析:a<b 为真,c<d (2<4) 为真,执行 x=1。

  1. 下述语句执行后,变量 k 的值是( )。
c
int k=1;
while (k++<10);
  • A. 10
  • B. 11
  • C. 9
  • D. 无限循环,值不定
查看答案与解析

答案:B

解析: 后缀自增 k++ 先用后增。当 k=10 时,先用 10 与 10 比较(结果为假),然后 k 自增为 11,循环结束。


难度: ⭐⭐ 考点: #后缀自增 #while循环

💡 学习锦囊

📖 相关公式与知识点:

  • k++:先使用 k 的当前值,再自增。
  • ++k:先自增,再使用新值。

易错点

注意区分 k++<10++k<10 的区别。

🔄 举一反三
  1. 若改为 while (++k<10);,k 最终值是多少?
    查看练习答案与解析

    答案:10 解析:当 k=9 时,++k 变为 10,10<10 为假,循环结束。

  1. 引用数组元素时,其下标表达式的值类型一定是( )。
    • A. char
    • B. int
    • C. double
    • D. bool
查看答案与解析

答案:B

解析: C 语言规定数组下标必须是整型表达式。


难度: ⭐ 考点: #数组下标

💡 学习锦囊

📖 相关公式与知识点:

  • 数组下标从 0 开始,必须是整型(或可隐式转换为整型)。
  • 下标越界不会引发编译错误,但会导致未定义行为。

思路分析

下标本质是内存偏移量,必须是整数才有意义。

🔄 举一反三
  1. a[2.5] 是否合法?
    查看练习答案与解析

    答案:不合法 解析:下标必须是整型,浮点数不能直接作为数组下标。

  1. 若对两个数组 a 和 b 进行初始化:
c
char a[]="ABCDEF";
char b[]={'A', 'B', 'C', 'D', 'E', 'F'};

则下列叙述正确的是( )。

  • A. a 与 b 数组完全相同
  • B. a 与 b 数组占用内存相同
  • C. a 与 b 数组都存放字符串
  • D. 数组 a 比数组 b 占用内存大
查看答案与解析

答案:D

解析:

  • a 用字符串初始化,自动添加 '\0',占用 7 字节。
  • b 用字符列表初始化,不自动添加 '\0',占用 6 字节。

难度: ⭐⭐ 考点: #字符串初始化 #sizeof

💡 学习锦囊

📖 相关公式与知识点:

  • 字符串字面量 "..." 自动包含结尾的 '\0'
  • 字符数组用 {} 初始化时不会自动添加 '\0'

易错点

b 不是合法的 C 字符串,因为缺少 '\0' 结束符。

🔄 举一反三
  1. char c[10]="ABC"; 占用多少字节?
    查看练习答案与解析

    答案:10 字节 解析:数组大小由定义决定,内容只占前 4 字节(含 '\0')。

  1. 若调用一个函数,且此函数中没有 return 语句,关于该函数返回值的说法正确的是( )。
    • A. 该函数没有返回值
    • B. 该函数返回若干系统默认值
    • C. 能返回一个用户所希望的函数值
    • D. 返回一个不确定的值
查看答案与解析

答案:D

解析: 如果函数声明为非 void 返回类型但没有 return 语句,函数会返回一个不确定的值(未定义行为)。如果函数声明为 void 类型,则明确无返回值,此时没有 return 语句是合法的。题目未指明函数返回类型,按传统 C 语言考试惯例,默认返回类型为 int,因此返回不确定的值,选 D。


难度: ⭐⭐ 考点: #函数返回值 #void

💡 学习锦囊

📖 相关公式与知识点:

  • void 类型函数不需要 return 语句(也可以使用 return;),明确无返回值。
  • 非 void 函数必须有 return 语句返回对应类型的值。
  • 非 void 函数缺少 return 语句时,返回值不确定(未定义行为)。

易错点

  • 误以为没有 return 语句就等于没有返回值(只有 void 函数才是真正无返回值)。
  • C89 标准中函数默认返回 int,缺少 return 时返回不确定的值。
🔄 举一反三
  1. 以下函数定义是否正确?
c
int func() { }
查看练习答案与解析

答案:不正确(或产生警告) 解析:声明为 int 返回类型但没有 return 语句,返回值不确定,属于未定义行为。

  1. 以下函数定义是否正确?
c
void func() { }
查看练习答案与解析

答案:正确 解析:void 函数不需要返回值,没有 return 语句是合法的。

  1. 若用数组名作为函数调用的实参,传递给形参的是( )。
    • A. 数组的首地址
    • B. 数组中第一个元素的值
    • C. 数组中的全部元素的值
    • D. 数组元素的个数
查看答案与解析

答案:A

解析: 数组名作为参数传递时,传递的是数组的首地址(指针),而非数组的副本。


难度: ⭐ 考点: #数组传参 #指针

💡 学习锦囊

📖 相关公式与知识点:

  • 数组名在作为函数参数时会退化为指针。
  • 形参数组声明 int a[] 等价于 int *a

思路分析

C 语言中数组传参是"传地址"而非"传值",函数内修改数组会影响原数组。

🔄 举一反三
  1. 如何在函数内获取传入数组的长度?
    查看练习答案与解析

    答案:无法直接获取,需要额外传递长度参数。 解析:数组退化为指针后,sizeof 只能得到指针大小。

  1. 设有程序段:char s[]="china"; char *p; p=s; 则下面叙述正确的是( )。
    • A. s 和 p 完全相同
    • B. 数组 s 中的内容和指针变量 p 中的内容相等
    • C. s 数组长度和 p 所指向的字符串长度相等
    • D. *p 与 s[0]相等
查看答案与解析

答案:D

解析: p 指向 s 的首地址,*p 等价于 s[0],都是字符 'c'。


难度: ⭐ 考点: #指针与数组 #解引用

💡 学习锦囊

📖 相关公式与知识点:

  • *p 等价于 p[0],等价于 s[0]
  • s 是数组名(常量),p 是指针变量(可修改)。

易错点

s 和 p 不完全相同:s 是常量地址不能自增,p 是变量可以自增。

🔄 举一反三
  1. p++s++ 哪个合法?
    查看练习答案与解析

    答案p++ 合法,s++ 不合法 解析:s 是数组名(常量),不能修改。

  1. 若已定义 char s[10]; 则在下面表达式中不表示 s[1]的地址是( )。
    • A. s+1
    • B. s++
    • C. &s[0]+1
    • D. &s[1]
查看答案与解析

答案:B

解析: s 是数组名,是常量指针,不能进行自增操作。s++ 试图修改常量,编译错误。


难度: ⭐ 考点: #数组名常量 #指针运算

💡 学习锦囊

📖 相关公式与知识点:

  • 数组名是地址常量,不能作为左值。
  • s+1&s[0]+1&s[1] 都表示 s[1] 的地址。

易错点

数组名可以参与加法运算(如 s+1),但不能被赋值或自增。

🔄 举一反三
  1. char *p = s; p++; 是否合法?
    查看练习答案与解析

    答案:合法 解析:p 是指针变量,可以自增。

  1. 若有定义:int a[2][3]; 则对 a 数组的第 i 行第 j 列元素的正确引用是( )。
    • A. *(a[i]+j)
    • B. (a+i)
    • C. *(a+j)
    • D. a[i]+j
查看答案与解析

答案:A

解析:a[i] 是第 i 行的首地址,a[i]+j 是第 i 行第 j 列的地址,*(a[i]+j) 是该位置的值。


难度: ⭐⭐ 考点: #二维数组 #指针引用

💡 学习锦囊

📖 相关公式与知识点:

  • a[i][j] 等价于 *(a[i]+j) 等价于 *(*(a+i)+j)
  • a[i]+j 是地址,不是值。

思路分析

二维数组元素有多种等价表示方式,理解指针与数组的关系是关键。

🔄 举一反三
  1. *(*(a+i)+j) 表示什么?
    查看练习答案与解析

    答案a[i][j]解析*(a+i) 是第 i 行首地址,再加 j 偏移后解引用。

  1. 已知学生记录描述为:
c
struct student
{
    int no;
    char name[20];
    char sex;
    struct {
        int year;
        int month;
        int day;
    } birth;
} s;

设结构变量 s 中的"birth"为"1985 年 10 月 1 日",则下面正确的赋值方式是( )。

  • A. year=1985; month=10; day=1;
  • B. birth.year=1985; birth.month=10; birth.day=1;
  • C. s.year=1985; s.month=10; s.day=1;
  • D. s.birth.year=1985; s.birth.month=10; s.birth.day=1;
查看答案与解析

答案:D

解析: 需要通过结构体变量 s 逐层访问嵌套的 birth 结构体成员:s.birth.year


难度: ⭐ 考点: #结构体 #嵌套访问

💡 学习锦囊

📖 相关公式与知识点:

  • 结构体成员访问:变量名.成员名
  • 嵌套结构体需要逐层使用 . 运算符。

易错点

不能跳过中间层直接访问嵌套结构体的成员。

🔄 举一反三
  1. 若定义 struct student *p = &s;,如何访问 birth.year?
    查看练习答案与解析

    答案p->birth.year解析:指针用 ->,成员用 .

二、基础知识填空(每空 2 分,共 22 分)

  1. C 源程序的基本单位是____________________。
查看答案与解析

答案: 函数

解析: C 语言是函数式语言,程序由函数组成,函数是 C 程序的基本组成单位。


难度: ⭐ 考点: #程序结构 #函数

💡 学习锦囊

📖 相关公式与知识点:

  • 一个 C 程序由一个或多个函数组成。
  • 必须有且仅有一个 main 函数。
🔄 举一反三
  1. C 程序的最小执行单位是什么?
    查看练习答案与解析

    答案:语句 解析:函数由语句组成,语句是最小执行单位。

  1. 按照计算机科学家沃思(Wirth)的提法,一个计算机程序应包括数据结构和____________________两部分。
查看答案与解析

答案: 算法

解析: 沃思提出著名公式:程序 = 数据结构 + 算法。


难度: ⭐ 考点: #程序概念 #算法

💡 学习锦囊

📖 相关公式与知识点:

  • 数据结构:数据的组织和存储方式。
  • 算法:解决问题的步骤和方法。
🔄 举一反三
  1. 沃思是哪本经典教材的作者?
    查看练习答案与解析

    答案:《Algorithms + Data Structures = Programs》 解析:沃思也是 Pascal 语言的发明者。

  1. 数学表达式 $y = \frac{a^2 + b^2}{x + y}$ 的 C 语言表达式是________________________________________。
查看答案与解析

答案: (a*a+b*b)/(x+y)

解析:

  • 平方用乘法表示:a*ab*b
  • 分子加括号:(a*a+b*b)
  • 分母加括号:(x+y)

难度: ⭐ 考点: #表达式转换 #运算符

💡 学习锦囊

📖 相关公式与知识点:

  • C 语言没有平方运算符,使用 a*apow(a,2)
  • 除法 / 的优先级高于加法,需要用括号控制运算顺序。

易错点

如果写成 a*a+b*b/x+y,由于优先级问题,结果完全不同。

🔄 举一反三
  1. $\sqrt{a+b}$ 的 C 语言表达式是什么?
    查看练习答案与解析

    答案sqrt(a+b)解析:需要 #include <math.h>

  1. 若 s 是 int 型变量,s=6;则表达式 s%2+(s+1)%2 的值为____________________。
查看答案与解析

答案: 1

解析:

  • s%2 = 6%2 = 0
  • (s+1)%2 = 7%2 = 1
  • 0 + 1 = 1

难度: ⭐ 考点: #取模运算

💡 学习锦囊

📖 相关公式与知识点:

  • % 是取模(求余)运算符。
  • n%2 可用于判断奇偶:结果为 0 是偶数,1 是奇数。
🔄 举一反三
  1. 若 s=5,表达式 s%2+(s+1)%2 的值是多少?
    查看练习答案与解析

    答案:1 解析:5%2=1,6%2=0,1+0=1。对于任意整数 s,该表达式恒为 1。

  1. C 语言本身不提供输入输出语句,其输入输出操作是由____________________来实现的。
查看答案与解析

答案: 函数(或库函数)

解析: C 语言的输入输出通过标准库函数实现,如 printfscanfgetcharputchar 等。


难度: ⭐ 考点: #输入输出 #库函数

💡 学习锦囊

📖 相关公式与知识点:

  • 常用 I/O 函数:printfscanfgetcharputchargetsputs
  • 需要 #include <stdio.h>
🔄 举一反三
  1. printf 是 C 语言的关键字吗?
    查看练习答案与解析

    答案:不是 解析:printf 是标准库函数,不是关键字。

  1. 已知 A=7.5, B=2, C=3.6, 表达式 A>B && C>A || A<B && !C>B 的值是____________________。
查看答案与解析

答案: 0

解析:

  • A>B = 7.5>2 = 真(1)
  • C>A = 3.6>7.5 = 假(0)
  • A>B && C>A = 1 && 0 = 0
  • A<B = 7.5<2 = 假(0)
  • !C>B = !(3.6>2) = !1 = 0
  • A<B && !C>B = 0 && 0 = 0
  • 0 || 0 = 0

难度: ⭐⭐ 考点: #逻辑运算 #优先级

💡 学习锦囊

📖 相关公式与知识点:

  • 运算符优先级:! > > < > && > ||
  • 注意 !C>B 等价于 (!C)>B,而非 !(C>B)

易错点

! 优先级高于 >!C>B 先计算 !C(C 非零则为 0),再与 B 比较。

🔄 举一反三
  1. !0 的值是多少?
    查看练习答案与解析

    答案:1 解析:逻辑非将假(0)变为真(1)。

  1. 设有以下定义语句:
c
int a[3][2]={10,20,30,40,50,60}, (*p)[2];
p=a;

则表达式 *(*(p+2)+1)的值为____________________。

查看答案与解析

答案: 60

解析: p 是指向含 2 个 int 元素数组的指针。p+2 指向第 3 行,*(p+2) 是第 3 行首地址,*(p+2)+1 是第 3 行第 2 列地址,*(*(p+2)+1) = a[2][1] = 60。


难度: ⭐⭐⭐ 考点: #数组指针 #二维数组

💡 学习锦囊

📖 相关公式与知识点:

  • int (*p)[2] 是数组指针,指向含 2 个 int 的数组。
  • p+1 跳过一整行(2 个 int)。

思路分析

数组指针的步长是一整行,p+i 指向第 i 行。

🔄 举一反三
  1. int *p[2]int (*p)[2] 有什么区别?
    查看练习答案与解析

    答案:前者是指针数组(2 个指针),后者是数组指针(指向含 2 个 int 的数组)。 解析[] 优先级高于 *,所以 *p[2] 是数组,(*p)[2] 是指针。

  1. 设 i,j,k 均为 int 型变量,则执行完下面的 for 循环后,k 的值为____________________。
c
for(i=0, j=10; i<=j; i++, j--)
    k=i+j;
查看答案与解析

答案: 10

解析: 每次循环 i+j 恒等于 10。最后一次循环 i=5, j=5 时,k=10,然后 i++ 变为 6,j-- 变为 4,i<=j 不成立,循环结束。


难度: ⭐⭐ 考点: #for循环 #变量追踪

💡 学习锦囊

📖 相关公式与知识点:

  • for 循环执行顺序:初始化 → 条件判断 → 循环体 → 增量 → 条件判断...
  • 逗号表达式允许多个初始化或增量语句。

思路分析

观察 i+j 恒为 10,最后一次满足条件时 i=j=5。

🔄 举一反三
  1. 若改为 for(i=0, j=10; i<j; i++, j--),k 的值是多少?
    查看练习答案与解析

    答案:10 解析:最后一次 i=4, j=6 时 k=10,之后 i=5, j=5 不满足 i<j。

  1. 在一个 C 程序中,若要定义一个只允许本源程序文件中所有函数使用的全局变量,则该变量需要定义的存储类别为____________________。
查看答案与解析

答案: static(静态)

解析:static 修饰的全局变量只在定义它的源文件内可见,其他文件无法访问。


难度: ⭐ 考点: #static #作用域

💡 学习锦囊

📖 相关公式与知识点:

  • static 全局变量:文件作用域,限制在本文件内。
  • static 局部变量:保持值在函数调用间不丢失。
  • extern:声明外部变量,扩展作用域。
🔄 举一反三
  1. static 修饰的局部变量有什么特点?
    查看练习答案与解析

    答案:只初始化一次,值在函数调用间保持。 解析:存储在静态存储区,生命周期为整个程序运行期。

  1. C 程序中,文件可以用____________________和二进制两种代码形式存放。
查看答案与解析

答案: 文本(或 ASCII)

解析: C 语言文件分为文本文件(ASCII 文件)和二进制文件两种。


难度: ⭐ 考点: #文件类型

💡 学习锦囊

📖 相关公式与知识点:

  • 文本文件:以 ASCII 码存储,可读性强。
  • 二进制文件:以内存中的二进制形式存储,节省空间。
  • fopen 模式:"r"/"w" 为文本,"rb"/"wb" 为二进制。
🔄 举一反三
  1. fopen("test.txt", "w") 打开的是什么类型的文件?
    查看练习答案与解析

    答案:文本文件 解析:不加 b 的模式默认为文本模式。

  1. 下面程序的运行结果是____________________
c
#include<stdio.h>
#define S(x) 4*x*x+1
void main ( )
{
    int m=6,n=8;
    printf("%d\n",S(m+n));
}
查看答案与解析

答案: 81

解析: 宏是文本替换:S(m+n)4*m+n*m+n+1 = 4*6+8*6+8+1 = 24+48+8+1 = 81。


难度: ⭐⭐ 考点: #宏定义 #文本替换

💡 学习锦囊

📖 相关公式与知识点:

  • 宏是预处理阶段的纯文本替换,不做计算。
  • 带参数宏应给每个参数加括号:#define S(x) 4*(x)*(x)+1

易错点

宏替换不遵循数学运算优先级,S(m+n) 展开后不是 4*(m+n)*(m+n)+1

🔄 举一反三
  1. 若宏定义为 #define S(x) 4*(x)*(x)+1S(m+n) 的值是多少?
    查看练习答案与解析

    答案4*(6+8)*(6+8)+1 = 4×14×14+1 = 785 解析:加了括号后按数学预期展开。

三、程序阅读题(每题 3 分,共 24 分)

1. 程序阅读

c
#include<stdio.h>
int main( )
{
    int a[4][4]={{1,2,3,4},{5,6,7,8},{11,12,13,14},{15,16,17,18}};
    int i=0,j=0,s=0;
    while (i++<4)
    {
        if (i==2 || i==4)
            continue;
        j=0;
        do {
            s+=a[i][j];
            j++;
        } while (j<4);
    }
    printf("%d\n", s);
    return 0;
}

题目: 写出程序的运行结果。

查看答案与解析

答案: 92

解析:

  • i++<4:i 先比较后自增
  • i=1 时(i++后 i=1,1<4 成立):i!=2 且 i!=4,累加 a[1][0..3] = 5+6+7+8 = 26
  • i=2 时(i++后 i=2,2<4 成立):i==2,continue 跳过
  • i=3 时(i++后 i=3,3<4 成立):累加 a[3][0..3] = 15+16+17+18 = 66
  • i=4 时(i++后 i=4,4<4 不成立):循环结束
  • s = 26+66 = 92

难度: ⭐⭐⭐ 考点: #循环控制 #continue

💡 学习锦囊

📖 相关公式与知识点:

  • continue 跳过本次循环剩余部分,进入下一次条件判断。
  • i++<4 先比较后自增,注意 i 在比较后立即变化。

思路分析

逐轮追踪 i 的值变化,注意 i++ 的时机和 continue 的跳过效果。

🔄 举一反三
  1. 若将 i++<4 改为 ++i<4,结果如何?
    查看练习答案与解析

    答案:循环次数减少 解析:前缀自增先增后用,i 从 1 开始比较。

2. 程序阅读

c
#include<stdio.h>
void copy_string(char *,char *);
int main()
{
    char a[]="I am a top man.";
    char b[]="You are teachers.";
    copy_string(a,b);
    printf("\nstring_a=%s\nstring_b=%s\n",a,b);
    return 0;
}
void copy_string(char *from,char *to)
{
    for(;*from!='\0';from++,to++)
        *to=*from;
    *to='\0';
}

题目: 写出程序的运行结果。

查看答案与解析

答案:

string_a=I am a top man.
string_b=I am a top man.

解析: copy_string 函数将 from 指向的字符串逐字符复制到 to 指向的位置,b 被 a 的内容完全覆盖。


难度: ⭐⭐ 考点: #字符串复制 #指针操作

💡 学习锦囊

📖 相关公式与知识点:

  • 字符串复制需要逐个字符操作,直到遇到 '\0'
  • 复制完成后必须手动添加 '\0'

易错点

目标数组必须有足够空间容纳源字符串(含 '\0')。

🔄 举一反三
  1. 标准库中哪个函数实现相同功能?
    查看练习答案与解析

    答案strcpy解析strcpy(to, from) 将 from 复制到 to。

3. 程序阅读

c
#include<stdio.h>
int main ( )
{
    int k=1,n=463;
    do
    {
        k*= n%10;
        n/=10;
    } while (n);
    printf("%d\n",k);
    return 0;
}

题目: 写出程序的运行结果。

查看答案与解析

答案: 72

解析: 计算 463 各位数字之积:

  • 第 1 轮:k = 1×(463%10) = 3,n = 46
  • 第 2 轮:k = 3×(46%10) = 18,n = 4
  • 第 3 轮:k = 18×(4%10) = 72,n = 0
  • n=0,循环结束,输出 72

难度: ⭐⭐ 考点: #数字分解 #do-while

💡 学习锦囊

📖 相关公式与知识点:

  • n%10 获取个位数字。
  • n/10 去掉个位数字。
  • do-while 至少执行一次循环体。
🔄 举一反三
  1. 若 n=12345,输出结果是多少?
    查看练习答案与解析

    答案:120 解析:1×2×3×4×5 = 120。

4. 程序阅读

c
#include <stdio.h>
int main()
{
    char c;
    printf("Enter a character:");
    c=getchar();
    if(c<0x20)
        printf("The character is a control character\n");
    else if(c>='0'&&c<='9')
        printf("The character is a digit\n");
    else if(c>='A'&&c<='Z')
        printf("The character is a capital letter\n");
    else if(c>='a'&&c<='z')
        printf("The character is a lower letter\n");
    else
        printf("The character is other character\n");
    return 0;
}

问题 4: 按键盘上的 Ctrl 键回车后,写出程序执行结果。

查看答案与解析

答案: The character is a control character

解析: Ctrl 组合键产生的字符 ASCII 码小于 0x20(32),属于控制字符。


难度: ⭐ 考点: #ASCII码 #字符分类

💡 学习锦囊

📖 相关公式与知识点:

  • 控制字符:ASCII 码 0~31(0x00~0x1F)。
  • 数字字符:'0'~'9'(ASCII 48~57)。
  • 大写字母:'A'~'Z'(ASCII 65~90)。
  • 小写字母:'a'~'z'(ASCII 97~122)。
🔄 举一反三
  1. 输入字符 '5',程序输出什么?
    查看练习答案与解析

    答案The character is a digit解析:'5' 在 '0'~'9' 范围内。

5. 程序阅读

c
#include <math.h>
#include <stdio.h>
void fun(int);
int main ( )
{
    int n;
    scanf("%d",&n);
    printf("%d=",n);
    if (n<0) printf("-");
    n = fabs(n);
    fun(n);
    return 0;
}
void fun (int n)
{
    int k,r;
    for (k=2; k<=sqrt(n); k++) {
        r = n % k;
        while (!r) {
            printf("%d",k);
            n=n/k;
            if (n>1) printf("*");
            r = n % k;
        }
    }
    if (n!=1) printf("%d\n",n);
}

题目: 若输入的值是 32,写出下面程序的运行结果。

查看答案与解析

答案: 32=2*2*2*2*2

解析: 这是质因数分解程序。32 不断除以 2:32÷2=16,16÷2=8,8÷2=4,4÷2=2,2÷2=1。输出 5 个 2。


难度: ⭐⭐ 考点: #质因数分解 #循环嵌套

💡 学习锦囊

📖 相关公式与知识点:

  • 质因数分解:不断用最小的质数去除 n,直到 n=1。
  • fabs(n) 取绝对值。
  • sqrt(n) 只需检查到平方根。

思路分析

外层 for 遍历可能的因数,内层 while 反复除以当前因数。

🔄 举一反三
  1. 输入 12,输出结果是什么?
    查看练习答案与解析

    答案12=2*2*3解析:12÷2=6,6÷2=3,3 是质数。

6. 程序阅读

c
#include <stdio.h>
int main()
{
    char *s="1221";
    int k=0,a=0,b=0;
    do
    {
        if(k%2==0)
        {
            a=a+s[k]-'0';
            continue;
        }
        b=b+s[k]-'0';
    } while(s[++k]);
    printf("k=%d\n a=%d \nb=%d\n",k,a,b);
    return 0;
}

题目: 写出程序的运行结果。

查看答案与解析

答案:

k=4
a=3
b=3

解析:

  • k=0(偶数):a = 0+'1'-'0' = 1,continue,s[++k]=s[1]='2'≠'\0' 继续
  • k=1(奇数):b = 0+'2'-'0' = 2,s[++k]=s[2]='2'≠'\0' 继续
  • k=2(偶数):a = 1+'2'-'0' = 3,continue,s[++k]=s[3]='1'≠'\0' 继续
  • k=3(奇数):b = 2+'1'-'0' = 3,s[++k]=s[4]='\0' 循环结束
  • 最终 k=4, a=3, b=3

难度: ⭐⭐⭐ 考点: #字符转数字 #do-while

💡 学习锦囊

📖 相关公式与知识点:

  • s[k]-'0' 将数字字符转换为对应的整数值。
  • s[++k] 先自增 k,再取 s[k] 的值。

思路分析

偶数下标累加到 a,奇数下标累加到 b。注意 s[++k] 在 while 条件中的自增时机。

🔄 举一反三
  1. 若 s="1234",a 和 b 的值分别是多少?
    查看练习答案与解析

    答案:a=4(1+3),b=6(2+4) 解析:偶数下标 0,2 累加到 a,奇数下标 1,3 累加到 b。

7. 程序阅读

c
#include <stdio.h>
int main( )
{
    FILE *fp;
    int i,k=0,n=0;
    fp=fopen("d1.dat","w");
    for(i=1;i<4;i++)
        fprintf(fp, "%3d",i);
    fclose(fp);
    fp=fopen("d1.dat","r");
    fscanf(fp, "%d%d",&k, &n);
    printf("%d,%d\n",k, n);
    fclose(fp);
    return 0;
}

题目: 写出程序执行后输出的结果。

查看答案与解析

答案: 1,2

解析: 写入文件的是 " 1 2 3"(每个数字占 3 个字符宽度)。读取时 %d%d 跳过空白读取前两个整数 1 和 2。


难度: ⭐⭐ 考点: #文件操作 #fprintf/fscanf

💡 学习锦囊

📖 相关公式与知识点:

  • fprintf 格式化写入文件,%3d 占 3 个字符宽度。
  • fscanf 格式化读取,%d 自动跳过空白字符。

易错点

写入格式和读取格式要匹配,否则可能读取到错误数据。

🔄 举一反三
  1. fprintf(fp, "%d", i) 不加宽度,写入内容是什么?
    查看练习答案与解析

    答案"123"解析:三个数字紧密排列,读取时 %d%d 会把 "123" 整体读给 k。

8. 程序阅读

c
#include<stdio.h>
int fun (char *);
int main ( )
{
    char *a="abcdef";
    printf("%d\n",fun(a));
    return 0;
}
int fun (char *s)
{
    char *p=s;
    while (*p) p++;
    return (p-s);
}

题目: 写出程序的运行结果。

查看答案与解析

答案: 6

解析: fun 函数计算字符串长度。p 从 s 开始移动到 '\0'p-s 即为字符个数。"abcdef" 长度为 6。


难度: ⭐ 考点: #字符串长度 #指针运算

💡 学习锦囊

📖 相关公式与知识点:

  • 指针相减得到两个地址之间的元素个数。
  • 等价于标准库函数 strlen

思路分析

p 遍历到字符串末尾,p-s 计算遍历了多少个字符。

🔄 举一反三
  1. 若 a="hello world",fun(a) 返回值是多少?
    查看练习答案与解析

    答案:11 解析:包含空格共 11 个字符。

四、程序填空题(每空 2 分,共 20 分)

1. 找闰年

程序功能: 找出 2009 年到 2050 年的所有闰年。

c
#include<stdio.h>
int main()
{
    int year,leap;
    for(year=2009;year<=2050;year++)
    {
        if( _____[1]_____ )
        {
            if(year%100==0)
            {
                if(______[2]______)
                    leap=1;
                else
                    leap=0;
            }
            else
                leap=1;
        }
        else
            leap=0;
        if(leap==1)
            printf("%d 是闰年!\n",year);
    }
    return 0;
}
查看答案与解析

答案:

(1) year%4==0 (2) year%400==0

解析: 闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。


难度: ⭐⭐ 考点: #闰年判断 #条件嵌套

💡 学习锦囊

📖 相关公式与知识点:

  • 闰年条件:(year%4==0 && year%100!=0) || year%400==0
  • 先判断能否被 4 整除,再区分世纪年。

易错点

世纪年(如 2100)能被 4 整除但不是闰年,必须能被 400 整除才是。

🔄 举一反三
  1. 2100 年是闰年吗?
    查看练习答案与解析

    答案:不是 解析:2100 能被 100 整除但不能被 400 整除。

2. 求和

程序功能: 按公式 $\sum_{k=1}^{100} k + \sum_{k=1}^{50} k^2 + \sum_{k=1}^{10} \frac{1}{k}$ 求和并输出结果。

c
#include<stdio.h>
int main ( )
{
    __________[3]__________;
    int k;
    for (k=1; k<=100; k++)
        s+=k;
    for (k=1; k<=50; k++)
        s+=k*k;
    for (k=1; k<=10; k++)
        s=s+__________[4]__________;
    printf("sum=%f",s);
    return 0;
}
查看答案与解析

答案:

(3) double s=0float s=0 (4) 1.0/k

解析:

  • s 需要是浮点类型,因为第三项求和涉及小数。
  • 1.0/k 确保浮点除法,1/k 在 k>1 时整数除法结果为 0。

难度: ⭐⭐ 考点: #累加求和 #类型转换

💡 学习锦囊

📖 相关公式与知识点:

  • 整数除法 /:两个整数相除结果仍为整数(截断)。
  • 浮点除法:至少一个操作数为浮点数。

易错点

1/k 当 k>1 时结果为 0,必须写成 1.0/k

🔄 举一反三
  1. 5/25.0/2 的结果分别是什么?
    查看练习答案与解析

    答案:2 和 2.5 解析:整数除法截断小数,浮点除法保留小数。

3. 数组复制

程序功能: 使数组 a[] 的内容复制到数组 b[] 中,当 a[i]=-999 时结束。

c
#include <stdio.h>
int arraycopy(int a[],int b[]);
int main()
{
    static int a[]={1,2,3,4,5,6,7,8,9,10,-999};
    int b[100], i = 0;
    arraycopy(a,b);
    while(b[i]!=-999)
        printf("%d ", b[i++]);
    return 0;
}
int arraycopy(int a[],int b[])
{
    int i=0;
    while(a[i]!=-999)
    {
        _____[5]_____;
        i++;
    }
    b[i]= _____[6]_____;
    return 0;
}
查看答案与解析

答案:

(5) b[i]=a[i] (6) -999

解析:

  • 逐元素复制直到遇到结束标记 -999。
  • 复制结束后在 b 数组末尾也添加 -999 作为结束标记。

难度: ⭐ 考点: #数组复制 #哨兵值

💡 学习锦囊

📖 相关公式与知识点:

  • 哨兵值(Sentinel):用特殊值标记数组结束。
  • 数组复制需要逐个元素操作。
🔄 举一反三
  1. 如果 a 数组中没有 -999,程序会怎样?
    查看练习答案与解析

    答案:数组越界,行为未定义 解析:while 循环会一直读取超出数组范围的内存。

4. 字符串倒置

程序功能: 通过递归的方法将字符串倒置。

c
void fun(char s[ ],int l,int h)
{
    if (_____[7]_____) return;
    else {
        char t;
        fun(_____[8]_____);
        t = s[l], s[l]=s[h], s[h]=t;
    }
}
查看答案与解析

答案:

(7) l>=h (8) s,l+1,h-1

解析:

  • 递归终止条件:左下标 >= 右下标,说明已完成或无需交换。
  • 递归调用:缩小范围,l+1, h-1 处理内层字符。

难度: ⭐⭐⭐ 考点: #递归 #字符串倒置

💡 学习锦囊

📖 相关公式与知识点:

  • 递归三要素:终止条件、缩小规模、组合结果。
  • 字符串倒置:首尾交换,中间部分递归处理。

思路分析

先递归到最内层,返回时逐层交换首尾字符。

🔄 举一反三
  1. 用迭代法如何实现字符串倒置?
    查看练习答案与解析

    答案:用 while(l<h) 循环交换 s[l] 和 s[h]。 解析:迭代法通常比递归法更高效。

5. 查找链表最小值

程序功能: 查找带头结点的单向链表中结点数据域的最小值。

c
struct node
{
    int data;
    struct node *next;
};
int min(struct node *head)
{
    struct node *p;
    int n;
    p=head;
    n=p->data;
    for(p=p->next;p; _____[9]_____)
        if(_____[10]_____) n=p->data;
    return n;
}
查看答案与解析

答案:

(9) p=p->next (10) p->data<n

解析:

  • 遍历链表:每次将 p 移动到下一个节点。
  • 更新最小值:当发现更小的数据时更新 n。

难度: ⭐⭐ 考点: #链表遍历 #查找最值

💡 学习锦囊

📖 相关公式与知识点:

  • 链表遍历:for(p=head; p!=NULL; p=p->next)
  • 带头结点链表:头结点的 data 域通常不使用或存储特殊值。

易错点

注意头结点的 data 是否参与比较,本题中 n 初始化为 head->data。

🔄 举一反三
  1. 如何查找链表中的最大值?
    查看练习答案与解析

    答案:将 p->data<n 改为 p->data>n解析:只需修改比较条件。

你正在阅读的是会员专属文档,💕 限时特惠进行中
你尚未登录,目前新用户可获3天体验会员,去登录